package Thread;


public class MultiThreading {
     private static final int NUM_THREADS = 20;
     private static int threadcount = 0;

    public static void main(String[] args) throws InterruptedException{
        for (int i = 0; i < NUM_THREADS; i++) {
            final int Thread_num = i;//每次都重新定义一次序号，用final修饰保证不变，而不是重新赋值

            new Thread( () -> {
                synchronized (MultiThreading.class){//用于保证同一时刻最多只有一个线程执行被synchronized修饰的代码
                    while(threadcount != Thread_num){
                            try {
                                MultiThreading.class.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                    }
                    System.out.println(threadcount);
                    threadcount++;
                    MultiThreading.class.notifyAll();
                }//这里结束锁
            }).start();//这里结束构造,这里切记要用start启动线程，忘记了一次
        }//for循环与线程代码结束，进入主线程
        synchronized (MultiThreading.class){ // 主线程等待子线程执行完毕
            while(threadcount<NUM_THREADS){
                MultiThreading.class.wait();//这里因为对象与子线程中synchronized的对象一样，所以子线程的notifyAll
            }                               //也会唤醒这个wait,所以这个wait会被唤醒19次，然后发现时机未到继续睡觉，第20次
        }                                   //出while循环，然后打印OK。
        System.out.println("OK");

    }
}
